package com.coisshi.base.common.exception;

import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.NotPermissionException;
import cn.dev33.satoken.exception.NotRoleException;
import cn.dev33.satoken.util.SaResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.convert.ConversionException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 全局异常处理
 *
 * @Author coisshi
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 处理业务异常
     */
    @ExceptionHandler(BizException.class)
    public SaResult handleBizException(BizException e) {
        log.warn("业务异常：{}", e.getMessage());
        return SaResult.error(e.getMessage()).setCode(e.getCode());
    }

    /**
     * 处理未登录异常
     *
     * @param nle nle
     * @return {@link SaResult }
     */
    @ExceptionHandler(NotLoginException.class)
    public SaResult handlerNotLoginException(NotLoginException nle) {
        // 不同异常返回不同状态码
        String message = "";
        if (nle.getType().equals(NotLoginException.NOT_TOKEN)) {
            message = "未提供Token";
        } else if (nle.getType().equals(NotLoginException.INVALID_TOKEN)) {
            message = "未提供有效的Token";
        } else if (nle.getType().equals(NotLoginException.TOKEN_TIMEOUT)) {
            message = "登录信息已过期，请重新登录";
        } else if (nle.getType().equals(NotLoginException.BE_REPLACED)) {
            message = "您的账户已在另一台设备上登录，如非本人操作，请立即修改密码";
        } else if (nle.getType().equals(NotLoginException.KICK_OUT)) {
            message = "已被系统强制下线";
        } else {
            message = "当前会话未登录";
        }
        // 返回给前端
        return SaResult.error().setCode(401).setData(message);
    }

    /**
     * 处理角色异常
     *
     * @param e e
     * @return {@link SaResult }
     */
    @ExceptionHandler
    public SaResult handlerNotRoleException(NotRoleException e) {
        return SaResult.error().setCode(403).setData( "无此角色：" + e.getRole());
    }

    /**
     * 处理权限异常
     *
     * @param e e
     * @return {@link SaResult }
     */
    @ExceptionHandler
    public SaResult handlerNotPermissionException(NotPermissionException e) {
        return SaResult.error().setCode(403).setData("无此权限：" + e.getCode());
    }

    /**
     * 处理程序转换异常
     *
     * @param e e
     * @return {@link SaResult }
     */
    @ExceptionHandler
    public SaResult handlerConversionException(ConversionException e) {
        return SaResult.error().setCode(500).setData("枚举转换异常" + e.getMessage());
    }
}
